﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Text;
using System.Threading.Tasks;
using Messenger.Lib;
namespace DA_SERVER
{
    public class XuLyServer : MarshalByRefObject, Messenger.Lib.IServer
    {
        XulyData data = new XulyData();
        //Internal Class
        [Serializable]
        public class Letter
        {
            string from;
            string to;
            string message;

            public Letter(string from, string to, string message)
            {
                this.from = from;
                this.to = to;
                this.message = message;
            }

            public string From
            {
                get
                {
                    return from;
                }
            }

            public string To
            {
                get
                {
                    return to;
                }
            }
            public string Message
            {
                get
                {
                    return message;
                }
            }
        }
        public XuLyServer()
        {
            data.LoadDataBase();
        }
        //Các phương thức server xử lý

        //xử lý đăng ký
        public bool SignUp(string username, string password, string fullName, string IP)
        {
            return data.Add(username, password, fullName, IP);
        }
        //Xử lý đăng nhập
        public bool SignIn(string username, string password, bool visible)
        {
            return data.SignIn(username, password, visible);
        }
        //Xử lý đăng xuất
        public bool SignOut(string username)
        {
            return data.SignOut(username);
        }
        //Xử lý load danh bạ username
        public ArrayList GetContacts(string username) {
            return data.GetContacts(username);
        }
        //Xử lý load tên đầy đủ
        public string GetFullName(string username)
        {
            return data.GetFullName(username);
        }
        //Load danh bạ người sử dụng
        public bool AddContact(string username, string contact) {
            return data.AddContact(username, contact);
        }
        //Xử lý nick online offline
        public bool IsVisible(string username) {
            return data.IsVisible(username);
        }
        //Lấy địa chỉ IP của 1 username
        public string GetIP(string username)
        {
            return data.GetIP(username);
        }
        private const int maxOfflineMessages = 100; // Giới hạn lượng tin nhắn offline tối đa
        ArrayList letters = new ArrayList();
        //Xử lý gửi tin nhắn
        public bool Send(string from, string to, string message) {
            // Kiểu tra sự tồn tại của đối tượng gửi.
            if (data.ContactExists(to) == false)
                return false;
            // Nếu bạn Chat đã đăng nhập thì gửi tin nhắn trực tiếp (kể cả ẩn nick)
            if (data.IsLoggedIn(to))
                letters.Add(new Letter(from, to, message));
            else
            {
                // Ngược lại, gửi tin nhắn Offline
                data.offlineMessages.Add(new Letter(from, to, message));
                if (data.offlineMessages.Count > maxOfflineMessages)
                {
                    data.offlineMessages.RemoveAt(0);
                }
                //Console.WriteLine(database.Save());
                Console.WriteLine(DateTime.Now.ToString() + ": Da gui tin nhan Offline toi " + to);
            }
            return true;
        }
        public LetterReceive Receive(string to)
        {
            int length = letters.Count;
            for (int i = 0; i < length; i++)
            {
                if (((Letter)letters[i]).To == to)
                {
                    LetterReceive lr = new LetterReceive(((Letter)letters[i]).Message, ((Letter)letters[i]).From);
                    letters.RemoveAt(i);
                    return lr;
                }
            }
            return new LetterReceive("", "");
        }
    }
    class Program
    {
        [STAThread]
        static void Main()
        {
            //Tạo một kênh đăng ký ở server
            HttpChannel kenh = new HttpChannel(9000);
            ChannelServices.RegisterChannel(kenh);
            Type calcType = Type.GetType("DA_SERVER.XuLyServer");
            //Đăng ký Singleton để duy trì kết nối đến Client 
            RemotingConfiguration.RegisterWellKnownServiceType(calcType, "SingletonServer", WellKnownObjectMode.Singleton);
            Console.ReadLine();
        }
    }
}
